/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Binding;

import java.util.ArrayList;
import javax.swing.Icon;
import javax.swing.JLabel;
import javax.swing.text.JTextComponent;
import logging.Logger;
/**
 *
 * @author benji
 */
public class Binder {

    private ArrayList<String> errorList; //Fehlerliste bei Bindings
    private boolean hasErrors = false;  //wenn fehler true


    public Binder(){
        errorList = new ArrayList<String>();
    }

    /**
     * Daten von der Datenbank in die GUI einbinden
     * @param component Hier Textfelder
     * @param value input für das zu befüllende feld
     */
    public void BindTo(JTextComponent component, Object value){
        if(value != null){
            component.setText(value.toString());
            Logger.info("Binder - bindTo " + component.getName());
        }
    }

    /**
     * Daten in Gui  binden
     * @param label Label
     * @param value Text
     */
    public void BindTo(JLabel label, Object value){
        if(value != null){
            label.setText(value.toString());
            Logger.info("Binder - bindTo " + label.getName());
        }
    }

    public void BindTo(JLabel label, Icon icon){
        if(icon != null){
            label.setIcon(icon);
        }
        else{
            label.setText("");
        }
    }




    /**
     * Daten von der GUI für die Software verwertbar machen
     * @return String - Text
     */
    public String BindFromString(JTextComponent component, Rule... rule){
        String input = component.getText();
        Logger.info("Binder - bindfrom " + component.getName());
        for(Rule r : rule){
            r.Evaluate(component, input, this);
        }
        if(hasErrors){
            showErrors();
        }
        return input;
    }


    /**
     * Daten von der GUI für die Software verwertbar machen
     * @param component Text Field
     * @param rule Rules
     * @return Ínteger
     */
    public int BindFromInt(JTextComponent component, Rule... rule){
        int input = 0;
        Logger.info("Binder - bindfrom " + component.getName());

        try{
            input = Integer.parseInt(component.getText());
        }
        catch(NumberFormatException ex){
            this.addErrors(component.getName() + "ist keine Zahl");
            Logger.error(component.getName() + " kann nicht in einen Integer konvertiert werden", ex);
        }
        for(Rule r : rule){
            r.Evaluate(component, input, this);
        }
        if(hasErrors){
            showErrors();
        }
        return input;
    }


    public Icon BindFromIcon(JLabel label, Rule...rule){
        Icon icon = null;
        icon = label.getIcon();
        return icon;
    }

    /**
     * Daten von der Gui in die Datenbank
     * @param label Labale von dem gelesen wird
     * @param rule  Rules die beachtet werden müssen
     * @return Integer des Inputs
     */
    public int BindFromInt(JLabel label, Rule... rule){
        int input = 0;

        Logger.info("Binder - bindfrom " + label.getName());
        try{
            input = Integer.parseInt(label.getText());
        }
        catch(NumberFormatException ex){
            this.addErrors(label.getName() + "ist keine Zahl");
            Logger.error(label.getName() + " kann nicht in einen Integer konvertiert werden", ex);
        }
        for(Rule r : rule){
            r.Evaluate(label, input, this);
        }
        if(hasErrors){
            showErrors();
        }
        return input;
    }


    /**
     * Sind beim Binding Fehler aufgetreten
     * @return
     */
    public boolean getHasErrors() {
        Logger.trace("getHasErrors");
        return hasErrors;
    }

    /**
     * Wenn Fehler hasErrors auf true setzen
     * @param hasErrors
     */
    public void setHasErrors(boolean hasErrors) {
        Logger.trace("setHasErrors");
        this.hasErrors = hasErrors;
    }

    /**
     * Fehlerliste löschen - neuen Durchgang starten
     */
    public void clearErrorList(){
        Logger.info("Binder - clear ErrorList");
        this.errorList.clear();
        setHasErrors(false);
        Logger.user(" ");
    }

    /**
     * wenn Fehler passirt sind Fehler hinzufügen
     * @param msg - Fehlermeldung
     */
    public void addErrors(String msg){
        Logger.info("Binder - addError");
        if(!hasErrors){
            this.errorList.add(msg);
        }
        else{
            this.errorList.add("\n" + msg);
        }
        setHasErrors(true);
    }

    /**
     * gibt alle Fehler auf den Errorpanel im hauptfenster aus
     */
    public void showErrors(){
        Logger.debug("ShowErrors");
        Logger.warn(errorList.toString());
        Logger.user(errorList.toString());
        //System.out.println(errorList.toString());
    }

}
